iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

打掉重練!Django的還債之旅~系列 第 11

Day11. 我們常寫的view,在這裡!

  • 分享至 

  • xImage
  •  

前言

今天的主題是我們最常在使用的部分,也就是view,django中要回傳response的方法大致可分為兩種,一種是class based,另一種是function based,至於兩種哪個比較好呢,各有好壞也有適合使用的時機,這個之後我們再來看看,而今天主要目的是要把這個view什麼時候被import進去,而我們自己寫的response又怎麼出去,那個地方給找出來~

根據昨天我們已經可以知道所有的request都會送進middleware_chain,而最裡面那層就是找到我們的view然後回傳,大致如下圖
https://ithelp.ithome.com.tw/upload/images/20230926/20162905n8hgT3VUzc.png
那我們就進去探險吧!!

正題

先找到_get_response的位置,會在django.core.hnadlers.base.BaseHandler其中一個function
https://ithelp.ithome.com.tw/upload/images/20230926/20162905C1PX8NEoC0.png
https://ithelp.ithome.com.tw/upload/images/20230926/20162905sIf7lfl6Bu.png
稍微看一下註解就能知道我們的目標是沒錯的!
接著往裡面看
https://ithelp.ithome.com.tw/upload/images/20230926/201629059eLEdJBSX9.png
首先會先看到,self.resolve_request(request)看起來會去處理request,但具體是怎麼處理的呢?
https://ithelp.ithome.com.tw/upload/images/20230926/201629058oCPtOdkUm.png
照著程式碼看,也可以很一目瞭然的知道他會去拿resolver之後把request.path丟進去找符合的,來看看誰又是reolver吧!
https://ithelp.ithome.com.tw/upload/images/20230926/201629059CJOPgrUz5.png
很直接的就叫做URLResolver了呢,而他的resolvefunction又做了什麼事呢!?
https://ithelp.ithome.com.tw/upload/images/20230926/20162905LHKIGsnDY5.png
https://ithelp.ithome.com.tw/upload/images/20230926/20162905J03iOg2v8y.png
可以看到他會去我們在settings.py中定義的ROOT_URL中找到該py檔案中的urlpatterns,然後跑一個for迴圈去比對,最後回傳一個ResolverMatch物件~
最後直接看看return了什麼給我們吧!

ResolverMatch(func=hello_app.views.hello, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[], route='')

可以看到他處理完request.path後就會幫我們找到對應的view function回來~
找到view function之後呢?
https://ithelp.ithome.com.tw/upload/images/20230926/20162905omg4FXgU14.png
會先把他丟給middleware,這邊是middleware如果含有process_viewfunction就會被加到self._view_middleware當中,然後在這邊處理request和view function
接著往下
https://ithelp.ithome.com.tw/upload/images/20230926/20162905wz46KBspO1.png
首先會先讓view function也就是callback看看需不需要變成原子,直接翻譯怪怪的,進去看看
https://ithelp.ithome.com.tw/upload/images/20230926/20162905qkqpxXzIfq.png
這邊應該是有特別設定參數在settings的話可以指定讓view變成原子性的方式
那再往下
https://ithelp.ithome.com.tw/upload/images/20230926/20162905MSsZrCLmVB.png
到這邊就會去把我們的view function邏輯跑完後得到response啦!
接著會去確認response是不是合法的,response亂return的話debug模式大概就可以看到卡這個function
https://ithelp.ithome.com.tw/upload/images/20230926/20162905ZKVR5bavqv.png
最後會再去跑一次middleware,如果該middleware含有process_template_response
https://ithelp.ithome.com.tw/upload/images/20230926/20162905CbRQqRbsLs.png
至此_get_response大概如下圖
https://ithelp.ithome.com.tw/upload/images/20230926/2016290542QDKRAGsc.png
注意!最後的return response還沒完全回出去唷!!
別忘了這個是我們的middleware_chain的最裡面,還要一層一層的跑回去,所以我們的middleware流程大致如下圖~
https://ithelp.ithome.com.tw/upload/images/20230926/201629055KAxrVJDQT.png

結語

request進來到response出去,django做的事情也不是一般的多,不過透過這次這樣看原始碼,我也更了解了平常寫的urls和view之間的關係~再來要想想明天要寫什麼了~~
/images/emoticon/emoticon36.gif


上一篇
Day10. middleware mixin
下一篇
Day12. 超級使用者 Super User
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言